Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

319
Visualizações
¿Cómo usar RewriteRule de modo que $_SERVER['REQUEST_URI'] también se modifique para PHP?

Con este .htaccess :

 RewriteEngine On RewriteRule foo/(.*) /foo-$1 # here I tried [L], [PT], [C], etc. RewriteRule . index.php [L]

Probé todas las banderas posibles para la primera RewriteRule, pero siempre, este código PHP:

 <?php echo $_SERVER['REQUEST_URI']; ?>

siempre repite /foo/bar en lugar de /foo-bar , al acceder a http://example.com/foo/bar . ¿Por qué?

¿Cómo hacer que RewriteEngine de Apache también modifique REQUEST_URI que verá PHP?

Nota: no quiero [R] porque una redirección generaría una nueva solicitud del navegador y cambiaría la URL que se muestra en la barra de URL, lo cual no quiero.

Consulte también RewriteRule cuando la cadena de sustitución no es una ruta de archivo sino una URL que debe ser procesada por las siguientes reglas .

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Creo que lo que intentas hacer es imposible sin algún trabajo. He proporcionado 2 soluciones en esta publicación, una usando auto_prepend_file y otra usando mod_proxy.

Solución 1: usando auto_prepend_file

Mire el script a continuación, esto no establece directamente el REQUEST_URI global, sino que lo sobrescribe en PHP, con el siguiente código:

.htaccess

 php_value auto_prepend_file "before.php" RewriteEngine On RewriteRule foo/(.*) /foo-$1 RewriteRule . index.php [L]

Asegúrate de agregar esta línea:

 php_value auto_prepend_file "before.php"

antes.php

En este script, puede reemplazar REQUEST_URI:

Me gusta:

 $_SERVER['REQUEST_URI'] = "/" . str_replace('/', '-', ltrim($_SERVER['REQUEST_URI'], "/"));

Puede mejorar aún más este script, pero creo que el concepto es claro.

índice.php

Index.php no se ve afectado pero contiene la regla reescrita:

 var_dump($_SERVER['REQUEST_URI']); //string(7) "/foo-bar"

Una solicitud a http://localhost/foo/bar?test es ahora: string(13) "/foo-bar?test"

Actualizar

Al usar [L], puede obtener la URL reescrita de la siguiente manera:

 var_dump($_SERVER['REDIRECT_URL']); # /foo-bar

Entonces el .htaccess se convierte en:

 php_value auto_prepend_file "before.php" RewriteEngine On RewriteRule foo/(.*) /foo-$1 [L] # please note [L] here RewriteRule . index.php [L]

Por lo tanto, before.php puede ser reemplazado por:

 $_SERVER['REQUEST_URI'] = $_SERVER['REDIRECT_URL'];

Actualizar la solución 2; usando mod_proxy

Descubrí que también puedes usar mod proxy:

Tuve que habilitar los siguientes módulos:

 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_ftp_module modules/mod_proxy_ftp.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_connect_module modules/mod_proxy_connect.so

Ahora su .htaccess se cambia a (observe la bandera [P]):

 RewriteEngine On RewriteRule ^foo/(.+)$ /foo-$1 [L,P] RewriteRule . index.php

Esto enviará todas las solicitudes de foo/bar a /foo-bar y cambiará $_SERVER['REQUEST_URI'] consecuencia.

 var_dump($_SERVER['REQUEST_URI']); //output: string(8) "/foo-bar"

Sin embargo, creo que usar el archivo de prefijo de PHP es una forma más eficiente.

over 4 years ago · Santiago Trujillo Relatório

0

$_SERVER['REQUEST_URI'] devuelve el original-uri Apache y no current-uri .

Directiva CGIVar

Con este archivo .htaccess :

 CGIVar REQUEST_URI current-uri RewriteRule (.*) index.php [L]

entonces una solicitud a example.com/hello/world dará:

 $_SERVER["REQUEST_URI"] "/index.php" $_SERVER["REDIRECT_URL"] "/hello/world"

Sin la línea CGIVar , daría "/hello/world" tanto para REQUEST_URI como para REDIRECT_URL .

over 4 years ago · Santiago Trujillo Relatório

0

Después de más investigaciones, parece que PHP siempre verá la URL original en $_SERVER['REQUEST_URI'] y no el objetivo de RewriteRule. (fuente autorizada necesaria aquí).

Por cierto, el destino de una RewriteRule suele ser un archivo que procesará la solicitud, excepto si usamos un indicador de redirección [R], entonces en este caso el navegador realizará una nueva solicitud a la nueva URL (y la URL del navegador cambios de barra).

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda